package pe.gob.bcrp.sgci.gestion.reportes.model.dao.impl.librosprincipales;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.ejb.Stateless;
//import javax.persistence.EntityManager;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Parameter;
import javax.persistence.Persistence;
import javax.persistence.Query;

//import oracle.jdbc.OracleTypes;

import org.eclipse.persistence.jpa.JpaEntityManager;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.eclipse.persistence.queries.StoredProcedureCall;
import org.eclipse.persistence.queries.ValueReadQuery;
import org.eclipse.persistence.sessions.Session;

import pe.gob.bcrp.sgci.gestion.reportes.model.dao.impl.DAOImpl;
import pe.gob.bcrp.sgci.gestion.reportes.model.dao.librosprincipales.ReporteVersionLibroDiarioDAO;
import pe.gob.bcrp.sgci.gestion.reportes.model.entity.librosprincipales.ReporteVersionLibroDiario;

@Stateless
public class ReporteVersionLibroDiarioDAOImpl extends DAOImpl<ReporteVersionLibroDiario> implements ReporteVersionLibroDiarioDAO{
	
	public ReporteVersionLibroDiarioDAOImpl() {
		super();
	}
	
	@SuppressWarnings("unchecked")
	public List<ReporteVersionLibroDiario> findByDesdeHasta(Date desde, Date hasta){
		
		StringBuffer query = new StringBuffer();
		  
		query.append("SELECT e ");
		query.append("FROM ReporteVersionLibroDiario e ");
		query.append("WHERE ");
		
		List<String> criteria = new ArrayList<String>();
		  
		if(desde != null){ 
			criteria.add("e.fecDesde = :desde"); 
		}
	  
		if(desde != null){ 
			criteria.add("e.fecHasta = :hasta"); 
		}
		if(criteria.size()==0){
			  query.append(" 1=1 ");
		}
		for (int i = 0; i < criteria.size(); i++) {
		  if(i > 0){
			  query.append(" AND ");
		  }
		  query.append(criteria.get(i));
		}
		
		Query q = em.createQuery(query.toString());
		
		if(desde != null){ 
			q.setParameter("desde", desde );  
		}
		if(hasta != null){ 
			q.setParameter("hasta", hasta);  
		}
		em.clear();
		em.close();
		return q.getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public List<ReporteVersionLibroDiario> findByDesdeHastaOficiales(Date desde, Date hasta){
		
		StringBuffer query = new StringBuffer();
		  
		query.append("SELECT e ");
		query.append("FROM ReporteVersionLibroDiario e ");
		query.append("WHERE ");
		
		List<String> criteria = new ArrayList<String>();
		  
		if(desde != null){ 
			criteria.add("e.fecDesde = :desde"); 
		}
	  
		if(desde != null){ 
			criteria.add("e.fecHasta = :hasta"); 
		}
		if(criteria.size()==0){
			  query.append(" 1=1 ");
		}
		for (int i = 0; i < criteria.size(); i++) {
		  if(i > 0){
			  query.append(" AND ");
		  }
		  query.append(criteria.get(i));
		}
		//BUSCA VERSIONES DE REPORTES OFICIALES, 1 = OFICIAL, 2 = BORRADOR
		query.append(" AND e.reporteVersion.codTipRepVer = '1'");
		Query q = em.createQuery(query.toString());
		
		if(desde != null){ 
			q.setParameter("desde", desde );  
		}
		if(hasta != null){ 
			q.setParameter("hasta", hasta);  
		}
		em.clear();
		em.close();
		return q.getResultList();
	}
	
	public long createNuevoReporteVersionLibroDiario(String tipoReporte, Date fechaDesde, Date fechaHasta){
		//SP_SGCI_CARGA_LIB_DIARIO
		long theBalance =0;		
		/*em.getTransaction().begin();  
		Session session = JpaHelper.getEntityManager(em).getActiveSession();
		ValueReadQuery databaseQuery = new ValueReadQuery();
		StoredProcedureCall call = new StoredProcedureCall();
		call.setProcedureName("PKG_SGCI_TOPCERT.SP_SGCI_CARGA_LIB_DIARIO");
		call.addNamedArgumentValue("TIPO", tipoReporte);
		call.addNamedArgumentValue("FEC_DESDE", fechaDesde);
		call.addNamedArgumentValue("FEC_HASTA", fechaHasta);
		call.addNamedOutputArgument("CORREL_LIBDIARIO", "CORREL_LIBDIARIO",OracleTypes.NUMBER);
		databaseQuery.setCall(call);
		Object result = session.executeQuery(databaseQuery);		
        System.out.println("----------retorna: "+result);
		em.getTransaction().commit();
		
		em.clear();
		em.close();
		*/
		return theBalance;
	}
/*
	public ReporteVersionLibroDiario findById(int codigo) {
		ReporteVersionLibroDiario rep = em.find(persistenceClass, codigo);
		em.clear();
		em.close();
        return rep;
    }*/

}
